gtk-builder-tool: Minimally validate <binding>
authorMatthias Clasen <mclasen@redhat.com>
Wed, 18 Dec 2019 21:58:10 +0000 (16:58 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:30:14 +0000 (19:30 -0400)
Check that the toplevel property name is legit.

gtk/tools/gtk-builder-tool-simplify.c

index 375702e72be1996b2c295add8ea1fa8d2fd2ba3e..6bc65b50158d2258a6eb8f6de94458e3f8abe7f3 100644 (file)
@@ -576,7 +576,10 @@ get_class_name (Element *element)
     }
   else if (g_str_equal (parent->element_name, "template"))
     {
-      return get_attribute_value (parent, "parent");
+      if (get_attribute_value (parent, "parent"))
+        return get_attribute_value (parent, "parent");
+      else
+        return get_attribute_value (parent, "class");
     }
 
   return NULL;
@@ -609,6 +612,19 @@ property_is_boolean (Element      *element,
   return FALSE;
 }
 
+static void
+warn_missing_property (Element      *element,
+                       MyParserData *data,
+                       const char   *class_name,
+                       const char   *property_name,
+                       PropKind      kind)
+{
+  const char *kind_str[] = { "", "Packing ", "Cell ", "Layout " };
+
+  g_printerr (_("%s:%d: %sproperty %s::%s not found\n"),
+              data->input_filename, element->line_number, kind_str[kind], class_name, property_name);
+}
+                       
 static gboolean
 property_can_be_omitted (Element      *element,
                          MyParserData *data)
@@ -651,18 +667,9 @@ property_can_be_omitted (Element      *element,
     return FALSE;
 
   pspec = get_property_pspec (data, class_name, property_name, kind);
-
   if (pspec == NULL)
     {
-      const char *kind_str[] = {
-        "",
-        "Packing ",
-        "Cell ",
-        "Layout "
-      };
-
-      g_printerr (_("%s:%d: %sproperty %s::%s not found\n"),
-                  data->input_filename, element->line_number, kind_str[kind], class_name, property_name);
+      warn_missing_property (element, data, class_name, property_name, kind);
       return FALSE;
     }
 
@@ -1592,6 +1599,14 @@ simplify_element (Element      *element,
       property_can_be_omitted (element, data))
     return TRUE;
 
+  if (g_str_equal (element->element_name, "binding"))
+    {
+      const char *property_name = get_attribute_value (element, "name");
+      const char *class_name = get_class_name (element);
+      if (!get_property_pspec (data, class_name, property_name, PROP_KIND_OBJECT))
+        warn_missing_property (element, data, class_name, property_name, PROP_KIND_OBJECT);
+    }
+
   return FALSE;
 }